home *** CD-ROM | disk | FTP | other *** search
/ Ian & Stuart's Australian Mac 1993 September / September 93.iso / Archives / Applications / Calculators / NumberCrunch 1.41 / Number Crunch II Demo / Writing External Codes (xCOD) / FORTRAN source code / PROPOGATE.f < prev    next >
Encoding:
Text File  |  1992-08-16  |  1.8 KB  |  68 lines  |  [TEXT/MPS ]

  1. C This can be compiled into an xCOD resource and inserted into NumberCrunch.
  2. C It needs an sCOD resource with the same ID, which will contain the Ascii characters:
  3. C
  4. C     xCOD xPROPOGATE(dT,zN:extended ;  X,Y: array ; program VXY(n:extended; xy:array) ), propogates a classical trajectory 
  5. C
  6. C
  7.  
  8.     SUBROUTINE PROPOGATE(dT, zN, X, Y, VXY)
  9.     implicit EXTENDED (a-h,o-z), INTEGER (i-n)
  10.     dimension X(*), Y(*)
  11.     external VXY
  12.  
  13. C PROPOGATE will send a particle forward along a 2 dimensional
  14. C classical trajectory. The gradient of the potential energy
  15. C (which is the negative of the force) is calculated by 
  16. C the external subroutine or user program VXY, 
  17. C which is called via
  18. C    Varray[1] = x
  19. C    Varray[2] = Y
  20. C    CALL VXY(2.0,Varray)
  21. C  Varray has (x,y) as input to VXY, and returns (dV/dX, dV/dY) as output.
  22. C Input to xPROPOAGATE:
  23. C            dT is the time step,
  24. C            zN is the size of the X and Y arrays,
  25. C            X(1), X(2), Y(1), and Y(2) are set to start the trajectory,
  26. C            VXY is an external subroutine or user program to calculate the gradient.
  27. C Output:
  28. C           X(3 to zN) and Yarr(3 to zN) have been calculated.
  29. C
  30. C Note that 
  31. C        - X and Y MUST point to zN component arrays (or the system crashes)
  32. C       - (zN-3) time steps forward are calculated.
  33. C
  34. C The algorithm used is just:
  35. C    X(n+1) = 2*X(n) - X(n-1) - dT^2 * Vx( X(n), Y(n) )
  36. C    Y(n+1) = 2*Y(n) - Y(n-1) - dT^2 * Vy( X(n), Y(n) )
  37. C
  38. C which you get from F=ma with m=1 , F=[-Vx,-Vy] , and 
  39. C    aX(n) = [X(n+1) - 2X(n) + X(n-1)]/dT^2, 
  40. C which is the simplest possible discretization.
  41. C
  42. C                        -Jim Mahoney,  7/11/89
  43.  
  44. C
  45. C  
  46.     extended Varray(2)
  47.     extended Two
  48.     
  49.     Two = 2.0
  50.     
  51.     Nmin1 = zN-1
  52.     dT2 = dT*dT
  53.     
  54.     do i=2,Nmin1
  55.     
  56.         Varray(1) = X(i)
  57.         Varray(2) = Y(i)
  58.         call VXY(Two, Varray)
  59.     
  60.         X(i+1) = 2.0*X(i) - X(i-1) - dT2 * Varray(1)
  61.         Y(i+1) = 2.0*Y(i) - Y(i-1) - dT2 * Varray(2)        
  62.     end do
  63.  
  64.     return
  65.     end
  66.  
  67. C That's it…